const flatData = [
  { id: 1, name: "Root", parent: null },
  { id: 2, name: "1-1", parent: 1 },
  { id: 3, name: "1-2", parent: 1 },
  { id: 4, name: "1-1-1", parent: 2 },
  { id: 5, name: "1-1-2", parent: 2 },
];

function buildTree(items) {  
  // 第一步：创建一个映射  
  const map = {};  
  items.forEach(item => map[item.id] = { ...item, children: [] });  
  
  // 第二步和第三步：构建树  
  const tree = [];  
  items.forEach(item => {  
    // 查找父节点  
    const parentId = item.parent;  
    if (parentId === null) {  
      // 没有父节点，即根节点  
      tree.push(map[item.id]);  
    } else {  
      // 否则，将其添加到父节点的 children 数组中  
      map[parentId].children.push(map[item.id]);  
    }  
  });  
  
  return tree;  
}  
  
const tree = buildTree(flatData);  
// 2 指定缩进用的空白字符串，用于美化输出；
console.log(JSON.stringify(tree, null, 2)); // 打印树结构
